/*
微信分发阅读平台 - 青龙脚本
支持自动化登录、内容获取、任务执行等功能

平台分析结果：
- 地址：http://yyyeee1190830.mcdur8a2di.xin/lbtxad/read?channel_id=11016
- 登录方式：微信扫码登录
- 技术架构：PHP + Nginx + 微信OAuth
- 客服QQ：3802451151

注意事项：
1. 微信登录需要用户手动扫码
2. 部分功能需要获取真实的微信token
3. 建议配合QL面板使用

作者：MiniMax Agent
更新时间：2025-11-06
*/

const axios = require('axios');
const fs = require('fs');
const path = require('path');

// 配置文件
const config = {
    baseURL: 'http://yyyeee1190830.mcdur8a2di.xin',
    channelId: '11016',
    requestTimeout: 10000,
    retryTimes: 3,
    userAgent: 'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.101 Mobile Safari/537.36'
};

// 存储数据的文件路径
const dataFile = path.join(__dirname, 'wechat_data.json');

// 初始化数据文件
function initDataFile() {
    if (!fs.existsSync(dataFile)) {
        const defaultData = {
            cookies: [],
            accessToken: '',
            userInfo: {},
            readHistory: [],
            lastUpdate: '',
            entries: []
        };
        fs.writeFileSync(dataFile, JSON.stringify(defaultData, null, 2));
    }
}

// 读取数据
function readData() {
    try {
        const data = fs.readFileSync(dataFile, 'utf8');
        return JSON.parse(data);
    } catch (error) {
        console.error('读取数据文件失败:', error.message);
        return {};
    }
}

// 保存数据
function saveData(data) {
    try {
        data.lastUpdate = new Date().toISOString();
        fs.writeFileSync(dataFile, JSON.stringify(data, null, 2));
    } catch (error) {
        console.error('保存数据文件失败:', error.message);
    }
}

// 创建HTTP请求实例
function createRequest() {
    const instance = axios.create({
        baseURL: config.baseURL,
        timeout: config.requestTimeout,
        headers: {
            'User-Agent': config.userAgent,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
        }
    });

    // 请求拦截器
    instance.interceptors.request.use(config => {
        console.log(`[${new Date().toLocaleString()}] 发送请求: ${config.method?.toUpperCase()} ${config.url}`);
        return config;
    });

    // 响应拦截器
    instance.interceptors.response.use(
        response => {
            console.log(`[${new Date().toLocaleString()}] 响应状态: ${response.status} ${response.config.url}`);
            return response;
        },
        error => {
            console.error(`[${new Date().toLocaleString()}] 请求失败: ${error.config?.url}`, error.message);
            return Promise.reject(error);
        }
    );

    return instance;
}

// 1. 获取入口页面和二维码
async function getEntryPage() {
    const request = createRequest();
    
    try {
        console.log('正在获取入口页面...');
        const response = await request.get(`/lbtxad/read?channel_id=${config.channelId}`);
        
        // 解析二维码URL
        const qrCodeMatch = response.data.match(/src="([^"]*wx_arrow\.png[^"]*)"/i);
        const qrCodeUrl = qrCodeMatch ? qrCodeMatch[1] : '';
        
        // 提取客服QQ
        const qqMatch = response.data.match(/QQ[：:]\s*(\d+)/i);
        const qqNumber = qqMatch ? qqMatch[1] : '';
        
        const result = {
            status: 'success',
            qrCodeUrl: qrCodeUrl ? `${config.baseURL}${qrCodeUrl}` : '',
            qqNumber: qqNumber,
            html: response.data
        };
        
        console.log('✅ 入口页面获取成功');
        console.log(`📱 二维码地址: ${result.qrCodeUrl}`);
        console.log(`👥 客服QQ: ${result.qqNumber}`);
        
        return result;
        
    } catch (error) {
        console.error('❌ 获取入口页面失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 2. 检查登录状态
async function checkLoginStatus() {
    const request = createRequest();
    const data = readData();
    
    try {
        console.log('正在检查登录状态...');
        const response = await request.get('/api/user/info', {
            headers: {
                'Cookie': data.cookies.join('; ')
            }
        });
        
        if (response.data.code === 0 || response.data.status === 'success') {
            console.log('✅ 已登录');
            return {
                loggedIn: true,
                userInfo: response.data.data || response.data
            };
        } else {
            console.log('❌ 未登录或登录已过期');
            return {
                loggedIn: false,
                message: response.data.message || '需要重新登录'
            };
        }
        
    } catch (error) {
        console.log('❌ 登录状态检查失败:', error.message);
        return {
            loggedIn: false,
            message: error.message
        };
    }
}

// 3. 获取内容列表
async function getContentList(page = 1, pageSize = 20) {
    const request = createRequest();
    const data = readData();
    
    try {
        console.log(`正在获取内容列表 (第${page}页)...`);
        const response = await request.get('/api/content/list', {
            params: {
                page: page,
                pageSize: pageSize,
                channel_id: config.channelId
            },
            headers: {
                'Cookie': data.cookies.join('; '),
                'X-Requested-With': 'XMLHttpRequest'
            }
        });
        
        const result = {
            status: 'success',
            data: response.data.data || response.data,
            page: page,
            pageSize: pageSize
        };
        
        console.log(`✅ 内容列表获取成功 (${page})`);
        console.log(`📊 获取到 ${result.data.list?.length || 0} 条内容`);
        
        return result;
        
    } catch (error) {
        console.error('❌ 获取内容列表失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 4. 获取具体内容
async function getContentDetail(contentId) {
    const request = createRequest();
    const data = readData();
    
    try {
        console.log(`正在获取内容详情: ${contentId}`);
        const response = await request.get(`/api/content/${contentId}`, {
            headers: {
                'Cookie': data.cookies.join('; ')
            }
        });
        
        const result = {
            status: 'success',
            content: response.data.data || response.data
        };
        
        console.log(`✅ 内容详情获取成功: ${contentId}`);
        
        return result;
        
    } catch (error) {
        console.error('❌ 获取内容详情失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 5. 执行阅读任务
async function performReadingTask(contentId, readTime = 30) {
    const request = createRequest();
    const data = readData();
    
    try {
        console.log(`开始执行阅读任务: ${contentId}, 阅读时长: ${readTime}秒`);
        
        // 模拟阅读行为
        await new Promise(resolve => setTimeout(resolve, readTime * 1000));
        
        // 记录阅读完成
        const response = await request.post('/api/reading/complete', {
            content_id: contentId,
            read_time: readTime
        }, {
            headers: {
                'Cookie': data.cookies.join('; '),
                'Content-Type': 'application/json'
            }
        });
        
        const result = {
            status: 'success',
            contentId: contentId,
            readTime: readTime,
            reward: response.data.data || response.data
        };
        
        console.log(`✅ 阅读任务完成: ${contentId}`);
        
        return result;
        
    } catch (error) {
        console.error('❌ 阅读任务执行失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 6. 获取用户奖励信息
async function getUserRewards() {
    const request = createRequest();
    const data = readData();
    
    try {
        console.log('正在获取用户奖励信息...');
        const response = await request.get('/api/user/rewards', {
            headers: {
                'Cookie': data.cookies.join('; ')
            }
        });
        
        const result = {
            status: 'success',
            rewards: response.data.data || response.data
        };
        
        console.log('✅ 用户奖励信息获取成功');
        
        return result;
        
    } catch (error) {
        console.error('❌ 获取用户奖励信息失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 7. 保存二维码到本地
async function saveQRCode() {
    try {
        console.log('正在保存二维码...');
        const entryData = await getEntryPage();
        
        if (entryData.status === 'success' && entryData.qrCodeUrl) {
            const request = createRequest();
            const response = await request.get(entryData.qrCodeUrl, {
                responseType: 'arraybuffer'
            });
            
            const qrCodePath = path.join(__dirname, 'qrcode.png');
            fs.writeFileSync(qrCodePath, response.data);
            
            console.log('✅ 二维码保存成功:', qrCodePath);
            return {
                status: 'success',
                path: qrCodePath,
                url: entryData.qrCodeUrl
            };
        } else {
            return {
                status: 'error',
                message: '未能获取二维码URL'
            };
        }
        
    } catch (error) {
        console.error('❌ 保存二维码失败:', error.message);
        return {
            status: 'error',
            message: error.message
        };
    }
}

// 8. 主执行函数
async function main() {
    console.log('🚀 微信分发阅读平台自动化脚本启动');
    console.log('=' .repeat(50));
    
    // 初始化数据文件
    initDataFile();
    
    try {
        // 1. 获取入口信息
        console.log('\n📋 步骤1: 获取入口信息');
        const entry = await getEntryPage();
        if (entry.status !== 'success') {
            throw new Error('获取入口信息失败');
        }
        
        // 2. 保存二维码
        console.log('\n📱 步骤2: 保存二维码');
        const qrResult = await saveQRCode();
        
        // 3. 检查登录状态
        console.log('\n🔐 步骤3: 检查登录状态');
        const loginStatus = await checkLoginStatus();
        
        if (!loginStatus.loggedIn) {
            console.log('⚠️  需要手动扫码登录');
            console.log('请扫描上方保存的二维码进行微信登录');
            console.log('登录后请重新运行脚本');
            return;
        }
        
        // 4. 获取内容列表
        console.log('\n📚 步骤4: 获取内容列表');
        const contentList = await getContentList(1, 10);
        
        if (contentList.status === 'success' && contentList.data.list) {
            // 5. 执行阅读任务
            console.log('\n📖 步骤5: 执行阅读任务');
            for (const item of contentList.data.list.slice(0, 3)) { // 只处理前3条
                const taskResult = await performReadingTask(item.id, 30);
                if (taskResult.status === 'success') {
                    console.log(`📝 已完成阅读: ${item.title}`);
                }
            }
        }
        
        // 6. 获取奖励信息
        console.log('\n🎁 步骤6: 获取奖励信息');
        const rewards = await getUserRewards();
        
        // 7. 保存执行结果
        const data = readData();
        data.executionResult = {
            time: new Date().toISOString(),
            entry: entry,
            loginStatus: loginStatus,
            contentList: contentList,
            rewards: rewards,
            qrCodeSaved: qrResult.status === 'success'
        };
        saveData(data);
        
        console.log('\n✅ 脚本执行完成！');
        console.log('=' .repeat(50));
        
    } catch (error) {
        console.error('\n❌ 脚本执行失败:', error.message);
        
        // 保存错误信息
        const data = readData();
        data.lastError = {
            time: new Date().toISOString(),
            message: error.message,
            stack: error.stack
        };
        saveData(data);
    }
}

// 9. 定时任务函数 (用于青龙面板)
async function scheduledTask() {
    console.log('🕐 定时任务开始执行...');
    
    try {
        // 登录状态检查
        const loginStatus = await checkLoginStatus();
        
        if (loginStatus.loggedIn) {
            // 执行阅读任务
            const contentList = await getContentList(1, 5);
            if (contentList.status === 'success') {
                for (const item of contentList.data.list) {
                    await performReadingTask(item.id, 30);
                    await new Promise(resolve => setTimeout(resolve, 2000)); // 间隔2秒
                }
            }
            
            // 获取最新奖励
            await getUserRewards();
            
            console.log('🕐 定时任务执行完成');
        } else {
            console.log('🕐 定时任务跳过 - 需要登录');
        }
        
    } catch (error) {
        console.error('🕐 定时任务执行失败:', error.message);
    }
}

// 10. 错误处理和数据恢复
function handleError(error) {
    console.error('🚨 发生严重错误:', error);
    
    // 记录错误到文件
    const errorLog = {
        timestamp: new Date().toISOString(),
        error: error.message,
        stack: error.stack,
        config: config
    };
    
    fs.appendFileSync(
        path.join(__dirname, 'error.log'), 
        JSON.stringify(errorLog, null, 2) + '\n'
    );
}

// 导出函数 (用于青龙面板)
module.exports = {
    main,
    scheduledTask,
    getEntryPage,
    checkLoginStatus,
    getContentList,
    getContentDetail,
    performReadingTask,
    getUserRewards,
    saveQRCode
};

// 如果直接运行此脚本
if (require.main === module) {
    const args = process.argv.slice(2);
    
    if (args[0] === 'schedule') {
        // 定时任务模式
        scheduledTask();
    } else {
        // 普通模式
        main().catch(handleError);
    }
}